package org.ym.tools;

import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @author ym
 * @date 2022-06-09 17:04:36
 */
public class Base64Tool {

    private Base64Tool() {
    }

    /**
     * 编码,UTF-8字符集
     *
     * @param str 字符串
     * @return 相同字符集编码后字符串, 参数为null时，返回null
     * @throws UnsupportedEncodingException 错误
     */
    public static String encode(String str) throws UnsupportedEncodingException {
        return encode(str, StandardCharsets.UTF_8);
    }

    /**
     * 编码
     *
     * @param str     字符串
     * @param charset 字符集
     * @return 相同字符集编码后字符串, 参数为null时，返回null
     * @throws UnsupportedEncodingException 错误
     */
    public static String encode(String str, Charset charset) throws UnsupportedEncodingException {
        if (StringUtils.isNotBlank(str)) {
            charset = charset == null ? StandardCharsets.UTF_8 : charset;
            return encode(str.getBytes(charset.name()), charset);
        } else {
            return null;
        }
    }

    /**
     * 编码
     *
     * @param data 数据
     * @return 相同字符集编码后字符串, 参数为null时，返回null
     */
    public static String encode(byte[] data) {
        return encode(data, StandardCharsets.UTF_8);
    }

    /**
     * 编码
     *
     * @param data    数据
     * @param charset 字符集
     * @return 相同字符集编码后字符串, 参数为null时，返回null
     */
    public static String encode(byte[] data, Charset charset) {
        if (data != null && data.length > 0) {
            charset = charset == null ? StandardCharsets.UTF_8 : charset;
            byte[] bytes = Base64.getEncoder().encode(data);
            return new String(bytes, charset);
        } else {
            return null;
        }
    }

    /**
     * 解码,UTF-8编码集
     *
     * @param str 字符串
     * @return 相同字符集解码后字符串, 参数为null时，返回null
     * @throws UnsupportedEncodingException 错误
     */
    public static String decode(String str) throws UnsupportedEncodingException {
        return decode(str, StandardCharsets.UTF_8);
    }

    /**
     * 解码
     *
     * @param str     字符串
     * @param charset 字符集
     * @return 相同字符集解码后字符串, 参数为null时，返回null
     * @throws UnsupportedEncodingException 错误
     */
    public static String decode(String str, Charset charset) throws UnsupportedEncodingException {
        if (StringUtils.isNotBlank(str)) {
            charset = charset == null ? StandardCharsets.UTF_8 : charset;
            return decode(str.getBytes(charset.name()), charset);
        } else {
            return null;
        }
    }

    /**
     * 解码
     *
     * @param data 数据
     * @return 相同字符集解码后字符串, 参数为null时，返回null
     */
    public static String decode(byte[] data) {
        return decode(data, StandardCharsets.UTF_8);
    }

    /**
     * 解码
     *
     * @param data    数据
     * @param charset 字符集
     * @return 相同字符集解码后字符串, 参数为null时，返回null
     */
    public static String decode(byte[] data, Charset charset) {
        if (data != null && data.length > 0) {
            charset = charset == null ? StandardCharsets.UTF_8 : charset;
            return new String(decodeToByte(data), charset);
        } else {
            return null;
        }
    }

    /**
     * 解码
     *
     * @param str 数据
     * @return 相同字符集解码后字符串, 参数为null时，返回null
     * @throws UnsupportedEncodingException 错误
     */
    public static byte[] decodeToByte(String str) throws UnsupportedEncodingException {
        return decodeToByte(str, StandardCharsets.UTF_8);
    }

    /**
     * 解码
     *
     * @param str     数据
     * @param charset 字符集
     * @return 相同字符集解码后字符串, 参数为null时，返回byte[0]
     * @throws UnsupportedEncodingException 错误
     */
    public static byte[] decodeToByte(String str, Charset charset) throws UnsupportedEncodingException {
        if (StringUtils.isNotBlank(str)) {
            charset = charset == null ? StandardCharsets.UTF_8 : charset;
            return decodeToByte(str.getBytes(charset.name()));
        } else {
            return new byte[0];
        }
    }

    /**
     * 解码
     *
     * @param data 数据
     * @return 相同字符集解码后字符串, 参数为null时，返回byte[0]
     */
    public static byte[] decodeToByte(byte[] data) {
        if (data != null && data.length > 0) {
            return Base64.getDecoder().decode(data);
        } else {
            return new byte[0];
        }
    }

}
